import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Authther: mrwu
 * @date:2021/3/4-03
 * @Description:PACKAGE_NAME
 */
public class Egxample {
    //通过反射实现两个数的交换
    static void swap(Integer a,Integer b) throws Exception{
        Class clsa = a.getClass();
        Field value = clsa.getDeclaredField("value");
        value.setAccessible(true);
        int c = a;
        value.setInt(a, b);
        value.setInt(b, c);
    }

    public static void main(String[] args) throws Exception{
//        Class  cls = Integer.class;
//        System.out.println(cls);
//        for (Field f:cls.getDeclaredFields()
//             ) {
//            System.out.println(f.getName()+"类名");
//        }

        Integer a =200,b=100;
        //当a=1,b=2 时输出结果为2，2 查找原因 interger缓存 将-127到128之间的数据缓存在内存中不会创建新的对象
        swap(a, b);
        System.out.println(a+" "+b);

        //调用方法 实力  Method.invoke()
        String s ="hello world";
        //获取substring方法 参数为int
        Method m = String.class.getDeclaredMethod("substring", int.class);

        String result = (String) m.invoke(s, 6);
        System.out.println(result);
        // 调用构造方法
        /**
         * 1 newInstance 方法 缺陷 不能传参
         * 2 Constructor 构造方法
         */
        //例 如果不传值则为默认构造方法
        //获取默认构造方法
        Constructor cons1 = String.class.getConstructor();
        //获取对应参数构造方法
        Constructor cons2 = String.class.getConstructor(String.class);
//        cons2.setAccessible(); 如果方法是非public 则需要调用
        String res =(String) cons2.newInstance("hello");
        System.out.println(res);
        //获取继承关系
        //获取父类的class
        Class cls01 = String.class;
        Class cls02 = cls01.getSuperclass();
        System.out.println(cls02);
        Class  o = cls02.getSuperclass();
        System.out.println(o);
        //获取interface

        //动态代理







    }
}
